home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / graphicgems4.lha / GemsIV / euler_angle / EulerAngles.h < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-06  |  3.5 KB  |  71 lines

  1. /**** EulerAngles.h - Support for 24 angle schemes ****/
  2. /* Ken Shoemake, 1993 */
  3. #ifndef _H_EulerAngles
  4. #define _H_EulerAngles
  5. #include "QuatTypes.h"
  6. /*** Order type constants, constructors, extractors ***/
  7.     /* There are 24 possible conventions, designated by:    */
  8.     /*      o EulAxI = axis used initially            */
  9.     /*      o EulPar = parity of axis permutation            */
  10.     /*      o EulRep = repetition of initial axis as last        */
  11.     /*      o EulFrm = frame from which axes are taken        */
  12.     /* Axes I,J,K will be a permutation of X,Y,Z.        */
  13.     /* Axis H will be either I or K, depending on EulRep.   */
  14.     /* Frame S takes axes from initial static frame.        */
  15.     /* If ord = (AxI=X, Par=Even, Rep=No, Frm=S), then        */
  16.     /* {a,b,c,ord} means Rz(c)Ry(b)Rx(a), where Rz(c)v        */
  17.     /* rotates v around Z by c radians.                */
  18. #define EulFrmS         0
  19. #define EulFrmR         1
  20. #define EulFrm(ord)  ((unsigned)(ord)&1)
  21. #define EulRepNo     0
  22. #define EulRepYes    1
  23. #define EulRep(ord)  (((unsigned)(ord)>>1)&1)
  24. #define EulParEven   0
  25. #define EulParOdd    1
  26. #define EulPar(ord)  (((unsigned)(ord)>>2)&1)
  27. #define EulSafe         "\000\001\002\000"
  28. #define EulNext         "\001\002\000\001"
  29. #define EulAxI(ord)  ((int)(EulSafe[(((unsigned)(ord)>>3)&3)]))
  30. #define EulAxJ(ord)  ((int)(EulNext[EulAxI(ord)+(EulPar(ord)==EulParOdd)]))
  31. #define EulAxK(ord)  ((int)(EulNext[EulAxI(ord)+(EulPar(ord)!=EulParOdd)]))
  32. #define EulAxH(ord)  ((EulRep(ord)==EulRepNo)?EulAxK(ord):EulAxI(ord))
  33.     /* EulGetOrd unpacks all useful information about order simultaneously. */
  34. #define EulGetOrd(ord,i,j,k,h,n,s,f) {unsigned o=ord;f=o&1;o>>=1;s=o&1;o>>=1;\
  35.     n=o&1;o>>=1;i=EulSafe[o&3];j=EulNext[i+n];k=EulNext[i+1-n];h=s?k:i;}
  36.     /* EulOrd creates an order value between 0 and 23 from 4-tuple choices. */
  37. #define EulOrd(i,p,r,f)       (((((((i)<<1)+(p))<<1)+(r))<<1)+(f))
  38.     /* Static axes */
  39. #define EulOrdXYZs    EulOrd(X,EulParEven,EulRepNo,EulFrmS)
  40. #define EulOrdXYXs    EulOrd(X,EulParEven,EulRepYes,EulFrmS)
  41. #define EulOrdXZYs    EulOrd(X,EulParOdd,EulRepNo,EulFrmS)
  42. #define EulOrdXZXs    EulOrd(X,EulParOdd,EulRepYes,EulFrmS)
  43. #define EulOrdYZXs    EulOrd(Y,EulParEven,EulRepNo,EulFrmS)
  44. #define EulOrdYZYs    EulOrd(Y,EulParEven,EulRepYes,EulFrmS)
  45. #define EulOrdYXZs    EulOrd(Y,EulParOdd,EulRepNo,EulFrmS)
  46. #define EulOrdYXYs    EulOrd(Y,EulParOdd,EulRepYes,EulFrmS)
  47. #define EulOrdZXYs    EulOrd(Z,EulParEven,EulRepNo,EulFrmS)
  48. #define EulOrdZXZs    EulOrd(Z,EulParEven,EulRepYes,EulFrmS)
  49. #define EulOrdZYXs    EulOrd(Z,EulParOdd,EulRepNo,EulFrmS)
  50. #define EulOrdZYZs    EulOrd(Z,EulParOdd,EulRepYes,EulFrmS)
  51.     /* Rotating axes */
  52. #define EulOrdZYXr    EulOrd(X,EulParEven,EulRepNo,EulFrmR)
  53. #define EulOrdXYXr    EulOrd(X,EulParEven,EulRepYes,EulFrmR)
  54. #define EulOrdYZXr    EulOrd(X,EulParOdd,EulRepNo,EulFrmR)
  55. #define EulOrdXZXr    EulOrd(X,EulParOdd,EulRepYes,EulFrmR)
  56. #define EulOrdXZYr    EulOrd(Y,EulParEven,EulRepNo,EulFrmR)
  57. #define EulOrdYZYr    EulOrd(Y,EulParEven,EulRepYes,EulFrmR)
  58. #define EulOrdZXYr    EulOrd(Y,EulParOdd,EulRepNo,EulFrmR)
  59. #define EulOrdYXYr    EulOrd(Y,EulParOdd,EulRepYes,EulFrmR)
  60. #define EulOrdYXZr    EulOrd(Z,EulParEven,EulRepNo,EulFrmR)
  61. #define EulOrdZXZr    EulOrd(Z,EulParEven,EulRepYes,EulFrmR)
  62. #define EulOrdXYZr    EulOrd(Z,EulParOdd,EulRepNo,EulFrmR)
  63. #define EulOrdZYZr    EulOrd(Z,EulParOdd,EulRepYes,EulFrmR)
  64.  
  65. EulerAngles Eul_(float ai, float aj, float ah, int order);
  66. Quat Eul_ToQuat(EulerAngles ea);
  67. void Eul_ToHMatrix(EulerAngles ea, HMatrix M);
  68. EulerAngles Eul_FromHMatrix(HMatrix M, int order);
  69. EulerAngles Eul_FromQuat(Quat q, int order);
  70. #endif
  71.